#include "gy39.h"
#include "word.h"

int gy39_data[3];

/* 设置串口参数（初始化串口） */
void init_tty(int fd)
{    
	//声明设置串口的结构体
	struct termios termios_new;
	//先清空该结构体
	bzero( &termios_new, sizeof(termios_new));
	//	cfmakeraw()设置终端属性，就是设置termios结构中的各个参数。
	cfmakeraw(&termios_new);
	//设置波特率
	//termios_new.c_cflag=(B9600);
	cfsetispeed(&termios_new, B9600);
	cfsetospeed(&termios_new, B9600);
	//CLOCAL和CREAD分别用于本地连接和接受使能，因此，首先要通过位掩码的方式激活这两个选项。    
	termios_new.c_cflag |= CLOCAL | CREAD;
	//通过掩码设置数据位为8位
	termios_new.c_cflag &= ~CSIZE;
	termios_new.c_cflag |= CS8; 
	//设置无奇偶校验
	termios_new.c_cflag &= ~PARENB;
	//一位停止位
	termios_new.c_cflag &= ~CSTOPB;
	tcflush(fd,TCIFLUSH);
	// 可设置接收字符和等待时间，无特殊要求可以将其设置为0
	termios_new.c_cc[VTIME] = 10;
	termios_new.c_cc[VMIN] = 1;
	// 用于清空输入/输出缓冲区
    	tcflush (fd, TCIFLUSH);
	//完成配置后，可以使用以下函数激活串口设置
	if(tcsetattr(fd,TCSANOW,&termios_new) )
		printf("Setting the serial1 failed!\n");
}


/*
    get_gy39_data:获取gy39模块的数据
    @COMX: gy39模块连接的串口的串口文件
    返回值：
        int
        成功 0
        失败 -1
    eg: 
        get_gy39_data("/dev/ttySAC1");
*/
int get_gy39_data(char *COMX)
{

    
    //1.打开串口文件
    int usart_fd = open(COMX, O_RDWR);
    if (usart_fd == -1)
    {
        perror("open usart fail");
        return -1;
    }

    //2.初始化串口(约定双方通信的串口协议、波特率、是否奇偶校验位、是否需要停止位、数据位)
    init_tty(usart_fd);

    //3.获取光照强度，发送获取光照强度的命令字节到COM2的文件中
    char lux_command[3] = {0xa5, 0x81, 0x26};
    int ret = write(usart_fd, &lux_command, 3);
    if (ret == -1)
    {
        printf("write lux command fail\n");
        close(usart_fd);
        return -1;
    }

    //4.读取COM2文件中获取到的光强数据,再解析
    char lux_data[9] = {0};
    read(usart_fd, &lux_data, 9);
    if (lux_data[2] == 0x15) //光照强度
    {
        gy39_data[0] = lux_data[4]<<24 | lux_data[5]<<16 | lux_data[6]<<8 | lux_data[7];
        gy39_data[0] /= 100;
    }

    //5. 发送命令字节获取温湿度、海拔、大气压
    char t_hum_command[3] = {0xa5, 0x82, 0x27};
    ret = write(usart_fd, &t_hum_command, 3);
    if (ret == -1)
    {
        printf("write t_hum command fail\n");
        close(usart_fd);
        return -1;
    }

    //6. 读取数据解析温湿度、海拔、大气压
    char t_hum_data[15] = {0};
    read(usart_fd, &t_hum_data, 15);
    if (t_hum_data[2] == 0x45)
    {
        //温度
        gy39_data[1] = t_hum_data[4]<<8 | t_hum_data[5];
        gy39_data[1] /= 100;

        // //气压
        // p = t_hum_data[6]<<24 | t_hum_data[7]<<8 | t_hum_data[8]<<8 | t_hum_data[9];
        // p /= 100;

        //湿度
        gy39_data[2] = t_hum_data[10]<<8 | t_hum_data[11];
        gy39_data[2] /= 100;

        // //海拔
        // h = t_hum_data[12]<<8 | t_hum_data[13];
    }

    printf("lux=%d t=%d hum=%d\n", gy39_data[0], gy39_data[1], gy39_data[2]);

    //7. 关闭串口文件
    close(usart_fd);
    return 0;
}




